package entidad;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * Clase encargada de hacer las veces de soporte, donde se guardan datos con los que la aplicacion trabaja.
 *
 * @package     entidad.
 * @author      Andres Silva
 *              Alejandro
 *              Francisco Monasterio
 *              Juan Felipe Sarmiento
 *              Giovanny Ricardo Rodriguez Chitiva.
 *
 * @version     0.4.
 * @see         Usuario.java, TiposServicios.java, Servicios.java, Clientes.java, MovimientoDetalles.java.
 * @copyright   2010.
 */
public class Sistema {

    public static ArrayList<Factura> getFacturas_array() {
        return facturas_array;
    }

    public static void setFacturas_array(ArrayList<Factura> facturas_array) {
        Sistema.facturas_array = facturas_array;
    }

    /**
     * Listado de usuarios del sistema.
     *
     * @access  Private
     * @var     ArrayList<Usuario>
    */
    private ArrayList<Usuario>              usuarios;

    /**
     * Listado de los tipos de servicios del sistema.
     *
     * @access  Private
     * @var     ArrayList<TiposServicios>
    */
    private ArrayList<TiposServicios>       tiposServicios;

    /**
     * Listado de los servicios del sistema.
     *
     * @access  Private
     * @var     ArrayList<Servicios>
    */
    static private ArrayList<Servicios>            servicios;


	private ArrayList<Movimientos> movimientos = new ArrayList<Movimientos>();


    /**
     * Listado de los detalles de movimientos en el sistema.
     *
     * @access  Private
     * @var     ArrayList<MovimientoDetalles>
    */
    private ArrayList<MovimientoDetalles>   detalles = new ArrayList<MovimientoDetalles>();

    /**
     * Listado de los clientes del sistema.
     *
     * @access  Private
     * @var     ArrayList<Clientes>
    */
     private static ArrayList<Clientes>      clientes;

    /**
     * Listado de las facturas 
     *
     * @access  Private
     * @var     ArrayList<Facturas>
    */

     private static ArrayList<Factura>      facturas_array;

   
    /*  INICIO SETTERS  */

    /**
     * Asigna la variable usuarios
     *
     * @access      Public
     * @param       ArrayList<Usuario>, listado de usuarios del sistema.
     * @return      null
     * @exception   null
     * @throws      null
    */
    public void setUsuarios (ArrayList<Usuario> val) {
        this.usuarios = val;
    }

	public void setMovimientos(Movimientos movimientos) {
        this.movimientos.add(movimientos);
    }



    /**
     * Asigna la variable TiposServicios
     *
     * @access      Public
     * @param       ArrayList<TiposServicios>, listado de los tipos de servicios del sistema.
     * @return      null
     * @exception   null
     * @throws      null
    */
    public void setTiposServicios(ArrayList<TiposServicios> tiposServicios) {
        this.tiposServicios = tiposServicios;
    }

    /**
     * Asigna la variable servicios
     *
     * @access      Public
     * @param       ArrayList<Servicios>, listado de los servicios del sistema.
     * @return      null
     * @exception   null
     * @throws      null
    */
    public void setServicios(ArrayList<Servicios> servicios) {
        this.servicios = servicios;
    }
    
    /**
     * Asigna un nuevo MovimientoDetalle a la variable detalles
     *
     * @access      Public
     * @param       MovimientosDetalles, detalle de un movimiento realizado en el sistema.
     * @return      null
     * @exception   null
     * @throws      null
    */
    public void addMovimientoDetalle(MovimientoDetalles detalle){
        detalles.add(detalle);
    }

    /**
     * Asigna la variable clientes
     *
     * @access      Static Public
     * @param       ArrayList<Clientes>, listado de los clientes del sistema.
     * @return      null
     * @exception   null
     * @throws      null
    */
    static public void setClientes(ArrayList<Clientes> _clientes) {
            clientes = _clientes;
    }

    /*  FIN SETTERS  */

    /*  INICIO GETTERS  */

    /**
     * Retorna el contenido de la variable usuarios.
     *
     * @access      Public
     * @return      ArrayList<Usuario>
     * @exception   null
     * @throws      null
    */
    public ArrayList<Usuario> getUsuarios () {
        return usuarios;
    }

    /**
     * Retorna el contenido de la variable tiposServicios.
     *
     * @access      Public
     * @return      ArrayList<TiposServicios>
     * @exception   null
     * @throws      null
    */
    public ArrayList<TiposServicios> getTiposServicios() {
	        return tiposServicios;
			  }

    /**
     * Retorna el contenido de la variable servicios.
     *
     * @access      Public
     * @return      ArrayList<Servicios>
     * @exception   null
     * @throws      null
    */
    public ArrayList<Servicios> getServicios() {
        return servicios;
    }

	public ArrayList<Movimientos> getMovimientos() {
        return movimientos;    }

    /**
     * Retorna el contenido de la variable detalles.
     *
     * @access      Public
     * @return      ArrayList<MovimientoDetalles>
     * @exception   null
     * @throws      null
    */
    public ArrayList<MovimientoDetalles> getDetalles(){
        return detalles;
    }

    /**
     * Retorna el contenido de la variable clientes.
     *
     * @access      Static Public
     * @return      ArrayList<Clientes>
     * @exception   null
     * @throws      null
    */
    static public ArrayList<Clientes> getClientes() {
            return clientes;
    }
    
    /*  FIN GETTERS  */

    /*  INICIO CRUD CLIENTES    */

    /**
     * Asigna un nuevo cliente a la variable clientes
     *
     * @access      Static Public
     * @param       Clientes, detalles del cliente a agregar.
     * @return      null
     * @exception   null
     * @throws      null
    */
    static public void add_cliente(Clientes _cliente){
            clientes.add(_cliente);
    }

    /**
     * Elimina un cliente de la variable clientes
     *
     * @access      Static Public
     * @param       Integer, numero de la cedula del cliente.
     * @return      null
     * @exception   null
     * @throws      null
    */
    static public void delete_cliente(int _cedula ){
            clientes.remove( search_cliente( _cedula ) );
    }

    /**
     * Busca un cliente en la variable clientes
     *
     * @access      Static Public
     * @param       Integer, numero de cedula del cliente.
     * @return      Clientes, detalles del cliente buscado
     * @exception   null
     * @throws      null
    */
    static public Clientes search_cliente(int _cedula ){
        Iterator _iterator_clientes = clientes.iterator();
        Clientes _aux_cliente;
        while(_iterator_clientes.hasNext()){
                _aux_cliente =  (Clientes)(_iterator_clientes.next());
                if (_aux_cliente.getCedula() == _cedula )
                        return _aux_cliente;
        }
        return null;
    }

    /**
     * Busca la ubicacion en el listado de clientes, de un cliente especifico.
     *
     * @access      Static Public
     * @param       Integer, numero de cedula del cliente.
     * @return      Integer, indice del array donde se encuentra el cliente
     * @exception   null
     * @throws      null
    */
    static public int search_cliente_by_index(int _cedula ){
        Iterator _iterator_clientes = clientes.iterator();
        Clientes _aux_cliente;
        int contador = 0;
        while(_iterator_clientes.hasNext()){
            _aux_cliente =  (Clientes)(_iterator_clientes.next());
            if (_aux_cliente.getCedula() == _cedula )
                return contador ;
            contador++;
        }
        return -1;
    }

    /**
     * Busca un cliente en la variable clientes
     *
     * @access      Static Public
     * @param       String, nombre del cliente.
     * @return      Clientes, detalles del cliente buscado
     * @exception   null
     * @throws      null
    */
    static public Clientes search_cliente(String _nombre ){
            Iterator _iterator_clientes = clientes.iterator();
            Clientes _aux_cliente;
            while(_iterator_clientes.hasNext()){
                    _aux_cliente =  (Clientes)(_iterator_clientes.next());
                    if (_aux_cliente.getNombre().equals(_nombre))
                            return _aux_cliente;
            }
            return null;
    }

    /**
     * Imprime en consola el listado de clientes
     *
     * @access      Static Public
     * @param       null.
     * @return      null
     * @exception   null
     * @throws      null
    */
    static public void debug_clientes(){
            Iterator _iterator_clientes = clientes.iterator();
            Clientes _aux_cliente;
            while(_iterator_clientes.hasNext()){
                    _aux_cliente =  (Clientes)(_iterator_clientes.next());
                    System.out.println(_aux_cliente.toString() );
            }
    }

    static public void add_factura(Factura _factura){
        if ( facturas_array == null)
            facturas_array = new ArrayList<Factura>();
        facturas_array.add(_factura);

    }

    static public void delete_factura(int _id ){
            facturas_array.remove( search_cliente( _id ) );
    }

    /**
     * Busca un cliente en la variable clientes
     *
     * @access      Static Public
     * @param       Integer, numero de cedula del cliente.
     * @return      Clientes, detalles del cliente buscado
     * @exception   null
     * @throws      null
    */
    static public Factura search_factura(int _id ){
        Iterator _iterator = facturas_array.iterator();
        Factura _aux_entity;
        while(_iterator.hasNext()){
                _aux_entity =  (Factura)(_iterator.next());
                if (_aux_entity.getId() == _id )
                        return _aux_entity;
        }
        return null;
    }

    /*  FIN CRUD CLIENTES*/

    static public int buscarServicioPorIndice(String nombre){
            Iterator iteratorServicios = servicios.iterator();

            Servicios auxServicios;
            int contador = 0;
            while(iteratorServicios.hasNext()){
            auxServicios = (Servicios)(iteratorServicios.next());
            //if (auxServicios.getNombre() == nombre )
            if (auxServicios.getNombre().equals(nombre))
            return contador ;
            contador++;
            }
            return -1;
        }
      
        static public void borrarServicios(String nombre){
        System.out.println(nombre);
        Servicios ser = buscarServicios(nombre);
        System.out.println(ser);

        servicios.remove(buscarServicios(nombre) );
        }

        static public void adicionarServicios(Servicios servicio){
        servicios.add(servicio);
        }


        static public Servicios buscarServicios(String nombre){
        System.out.println(nombre);
        Iterator iteratorServicios = servicios.iterator();
        Servicios auxServicios;
        while(iteratorServicios.hasNext()){
        auxServicios = (Servicios)(iteratorServicios.next());
        //if (auxServicios.getNombre() == nombre )
        if (auxServicios.getNombre().equals(nombre))
        return auxServicios;
        }
        return null;
        }

        public static boolean isNumeric(String cadena){
            try {
                Integer.parseInt(cadena);
                return true;
            } catch (Exception e){
                return false;
            }
        }
}